package com.livro.capitulo3.categoria.dao;

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;

import com.livro.capitulo3.categoria.Categoria;
import com.livro.capitulo3.util.HibernateUtil;

public class CategoriaDAO {
	
	private Session sessao;
	private Transaction transacao;
	
	public void adiciona(Categoria categoria) {
		try {
			sessao = HibernateUtil.getSessionFactory().openSession();
			transacao = sessao.beginTransaction();
			sessao.save(categoria);
			transacao.commit();
		} catch (HibernateException e) {
			System.out.println("Não foi possível inserir a categoria. Erro: " + e.getMessage());
		} finally {
			try {
				if (sessao.isOpen()) {
					sessao.close();
				}
			} catch (Throwable e2) {
				System.out.println("Erro ao fechar operações de inserção. Mensagem: " + e2.getMessage());
			}
		}
	}
	
	public void atualizar(Categoria categoria) {
		try {
			sessao = HibernateUtil.getSessionFactory().getCurrentSession();
			transacao = sessao.beginTransaction();
			sessao.update(categoria);
			transacao.commit();
		} catch (HibernateException e) {
			System.out.println("Não foi possível alterar a categoria. Erro: " + e.getMessage());
		} finally {
			try {
				if (sessao.isOpen()) {
					sessao.close();
				}
			} catch (Throwable e2) {
				System.out.println("Erro ao fechar operações de atualização. Mensagem: " + e2.getMessage());
			}
		}
	}
	
	public Categoria buscaCategoria(Integer codigo) {
		Categoria categoria = null;
		try {
			sessao = HibernateUtil.getSessionFactory().getCurrentSession();
			transacao = sessao.beginTransaction();
			Criteria filtro = sessao.createCriteria(Categoria.class);
			filtro.add(Restrictions.eq("categoria", codigo));
			categoria = (Categoria) filtro.uniqueResult();
			transacao.commit();
		} catch (Throwable e) {
			if (transacao.isActive()) {
				transacao.rollback();
			}
		} finally {
			try {
				if (sessao.isOpen()) {
					sessao.close();
				}
			} catch (Throwable e2) {
				System.out.println("Erro ao fechar operação de busca. Mensagem: " + e2.getMessage());
			}
		}
		return categoria;
	}

}
